package pe.gob.minam.sismon.core.dao.impl;

import static pe.gob.minam.sismon.core.util.ConstantesCore.HABILITADO;
import static pe.gob.minam.sismon.core.util.UtilCore.establecerCondicion;
import static pe.gob.minam.sismon.core.util.UtilCore.establecerParam;

import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import pe.gob.minam.sismon.core.base.dao.impl.BaseDaoImpl;
import pe.gob.minam.sismon.core.dao.SegOpcionDao;
import pe.gob.minam.sismon.core.domain.SegOpcion;
import pe.gob.minam.sismon.core.util.ExceptionCore;

@Repository("segOpcionDao")
public class SegOpcionDaoImpl extends BaseDaoImpl<SegOpcion> implements SegOpcionDao {

	@SuppressWarnings("unchecked")
	@Override
	public List<SegOpcion> listarOpciones(Integer idSistema, String nombreCorto, String nombreLargo, String estado)
			throws ExceptionCore {
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT g FROM SegOpcion g ");
		sql.append("INNER JOIN FETCH g.gnrSistema ");
		sql.append("where 1=1 ");
		
		establecerCondicion(sql, " AND g.gnrSistema.idSistema=:idSistema", idSistema);
		establecerCondicion(sql, " AND g.nombreCorto=:nombreCorto", nombreCorto);
		establecerCondicion(sql, " AND g.nombreLargo=:nombreLargo", nombreLargo);
		establecerCondicion(sql, " AND g.estado=:estado", estado);

		Query query = getEntityManager().createQuery(sql.toString());

		establecerParam(query, "idSistema", idSistema);
		establecerParam(query, "nombreCorto", nombreCorto);
		establecerParam(query, "nombreLargo", nombreLargo);
		establecerParam(query, "estado", estado);

		return (List<SegOpcion>) query.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SegOpcion> listarOpcionesPadre(Integer idSistema) throws ExceptionCore{
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT g FROM SegOpcion g ");
		sql.append(" WHERE g.gnrSistema.idSistema=:idSistema");
		sql.append(" AND g.tipoOpcion=:tipoOpcion");
		sql.append(" AND g.estado=:estado");
		
		Query query = getEntityManager().createQuery(sql.toString());
		
		establecerParam(query, "idSistema", idSistema);
		establecerParam(query, "tipoOpcion", String.valueOf(HABILITADO));
		establecerParam(query, "estado", String.valueOf(HABILITADO));

		return (List<SegOpcion>) query.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SegOpcion> listarOpcionesHijo(Integer idSistema,
			Integer idOpcion) throws ExceptionCore {
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT g FROM SegOpcion g ");
		sql.append(" WHERE g.gnrSistema.idSistema=:idSistema");
		sql.append(" AND g.idOpcionPadre=:idOpcionPadre");
		
		Query query = getEntityManager().createQuery(sql.toString());
		
		establecerParam(query, "idSistema", idSistema);
		establecerParam(query, "idOpcionPadre", idOpcion);

		return (List<SegOpcion>) query.getResultList();
		
	}
	
}
